/**
 * ============================================================
 * 版权           ： 北京嘉和美康信息技术有限公司 版权所有 (c) 2013
 * 创建人      ：吴志敏 wuzhimin@bjgoodwill.com 研发中心
 * 创建日期 ：2013-1-14 下午2:25:32
 * 描述           ：
 * 修订历史 ： 
 * ============================================================
 */
package com.hustzp.com.xichuangzhu.utils;

import android.content.Context;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * <p>
 * </p>
 * 
 * @author 吴志敏 研发中心 2013-1-14 下午2:25:32
 */
public class AssetsFileUtils {
	public static int BUFFER_SIZE = 4098;

	/**
	 * 递归算法，从Assets文件夹向SD卡复制文件，可遍历子文件夹
	 * 
	 * @param context
	 * @param fileName
	 * @param sdFilePath
	 * @throws IOException
	 * @author 吴志敏 研发中心 2013-1-14下午3:08:56
	 */
	public static void copyFile(Context context, String fileName,
			String sdFilePath) throws IOException {
		String[] apks = context.getAssets().list(fileName);
		if (apks.length == 0) {
			copyFileFromAssets(context, fileName, sdFilePath);
		} else {
			for (int i = 0; i < apks.length; i++) {
				String[] tempFiles = context.getAssets().list(
						fileName + "/" + apks[i]);
				if (tempFiles.length == 0) {
					copyFile(context, fileName + "/" + apks[i], sdFilePath
							+ File.separator + apks[i]);
				} else {
					if (!FileUtils.isFileExist(sdFilePath + File.separator
							+ apks[i])) {
						FileUtils.createSDDir(sdFilePath + File.separator
								+ apks[i]);
					}
					copyFile(context, fileName + "/" + apks[i], sdFilePath
							+ File.separator + apks[i]);
				}
			}
		}
	}

	/**
	 * 
	 * <p>
	 * 复制文件监听器
	 * </p>
	 * 
	 * @author 吴志敏 研发中心 2013年8月19日 上午10:11:37
	 */
	public interface OnCopyFileListener {
		void onCoping();

		void onCoped();
	}

	/**
	 * 复制文件且可监听复制状态
	 * 
	 * @param context
	 * @param oldFile
	 * @param newFile
	 * @param copyFileListener
	 * @author 吴志敏 研发中心 2013年8月19日上午10:14:27
	 */
	public static void copyFileFromAssets(Context context, String oldFile,
			String newFile, OnCopyFileListener copyFileListener) {
		File tempFile = new File(newFile);
		// 文件不存在，复制
		if (!tempFile.exists()) {
			InputStream in = null;
			OutputStream out = null;
			try {
				in = context.getAssets().open(oldFile);
				out = new FileOutputStream(newFile);
				byte[] buffer = new byte[BUFFER_SIZE];
				int length = 0;
				while ((length = in.read(buffer)) != -1) {
					out.write(buffer, 0, length);
					if (copyFileListener != null) {
						copyFileListener.onCoping();
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (copyFileListener != null) {
					copyFileListener.onCoped();
				}
				if (in != null)
					FileUtils.closeStream(in);
				if (out != null)
					FileUtils.closeStream(out);
			}
		}
	}

	/**
	 * 从Assets文件夹向SD卡复制文件
	 * 
	 * @param oldFile
	 * @param newFile
	 * @author 吴志敏 研发中心 2013-1-14下午2:11:48
	 */
	public static void copyFileFromAssets(Context context, String oldFile,
			String newFile) {
		File tempFile = new File(newFile);
		// 文件不存在，复制
		if (!tempFile.exists()) {
			InputStream in = null;
			OutputStream out = null;
			try {
				in = context.getAssets().open(oldFile);
				out = new FileOutputStream(newFile);
				FileUtils.copy(in, out);
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (in != null)
					FileUtils.closeStream(in);
				if (out != null)
					FileUtils.closeStream(out);
			}
		}
	}

	/**
	 * 比较两个文件大小
	 * 
	 * @param context
	 * @param oldFile
	 * @param newFile
	 * @return
	 * @author 吴志敏 研发中心 2013年8月14日下午3:21:38
	 */
	public static boolean compareFileSize(Context context, String oldFile,
			String newFile) {
		boolean result = false;
		InputStream in = null;
		InputStream inNewFile = null;
		try {
			in = context.getAssets().open(oldFile);
			inNewFile = new FileInputStream(newFile);
			if (in.available() == inNewFile.available()) {
				result = true;
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (in != null)
				FileUtils.closeStream(in);
			if (inNewFile != null)
				FileUtils.closeStream(inNewFile);
		}
		return result;
	}
}
